from database import db_session

from models import *

from werkzeug.security import generate_password_hash, \
check_password_hash

from sqlalchemy import exc
from flask import flash

def set_password(password):
    return generate_password_hash(password)

def check_password(pw_hash, password):
    return check_password_hash(pw_hash, password)

def verificar_login(username, password):
    """Comprueba que el usuario y la contrasena ingresados en el login
    sean validos
    @param username: Nombre de usuario
    @param password: Contrasena del usuario"""
    try:
        usuario = db_session.query(Usuario). \
        filter_by(id_usuario=username).one()

        if usuario.estado == 'INA':
            flash('Usuario Inactivo')
            return False

        usuario_contrasena = usuario.contrasena

        if not check_password(usuario_contrasena, password):
            flash('La contrasena no es correcta')
            return False
        return True
    except exc.SQLAlchemyError:
        flash('El usuario no existe')
        return False

def buscar_roles(id_usuario, nombre_proyecto, nombre_fase):
    """Retorna la lista de roles del usuario especificado
    @param id_usuario: Usuario logueado
    @param nombre_proyecto: Nombre del proyecto actual
    @param nombre_fase: Nombre de la fase actual"""
    
    usuario = db_session.query(Usuario).filter_by(id_usuario=\
    id_usuario).one()
    permiso = None
    lista_permisos = []

    if usuario.tipo == 1:
        permiso = "Administrador"
    if usuario.tipo == 2:
        permiso = "Lider"
    if usuario.tipo == 3:
        permiso = "Usuario"

    lista_permisos.append(permiso)

    if nombre_proyecto != None and nombre_fase != None:
        try:
            proyecto = db_session.query(Proyecto).filter_by(nombre=\
            nombre_proyecto).one()

            fase = db_session.query(Fase).filter_by(nombre=\
            nombre_fase, fk_proyecto=proyecto.id).one()

            for rol in usuario.roles:
                if rol.fk_fase == fase.id:
                    for perm in rol.permisos:
                        permiso = perm.descripcion
                        lista_permisos.append(permiso)
        except exc.SQLAlchemyError:
            pass

    return lista_permisos

def tiene_permiso(id_usuario, nombre_proyecto, nombre_fase, permiso):
    """Comprueba que el usuario tenga un rol de la fase especificada 
    con el permiso dado
    @param id_usuario: Usuario logueado
    @param nombre_proyecto: Nombre del proyecto actual
    @param nombre_fase: Nombre de la fase actual
    @param permiso: Nombre del permiso ingresado"""
    
    usuario = db_session.query(Usuario).filter_by(id_usuario=\
    id_usuario).one()

    proyecto = db_session.query(Proyecto).filter_by(nombre=\
    nombre_proyecto).one()

    fase = db_session.query(Fase).filter_by(nombre=\
    nombre_fase, fk_proyecto=proyecto.id).one()

    for rol in usuario.roles:
        if rol.fk_fase == fase.id:
            for perm in rol.permisos:
                if perm.descripcion == permiso:
                    return True

    return False

def tiene_permiso_aceptado(id_usuario, nombre_proyecto, nombre_fase, \
permisos):
    """Comprueba que el usuario tenga un rol de la fase especificada 
    con alguno de los permisos dados
    @param id_usuario: Usuario logueado
    @param nombre_proyecto: Nombre del proyecto actual
    @param nombre_fase: Nombre de la fase actual
    @param permisos: Lista de permisos ingresados"""
    
    for permiso in permisos:
        resultado = tiene_permiso(id_usuario, nombre_proyecto, \
        nombre_fase, permiso)
        if resultado:
            return True

    return False
